package ru.susu.algebra.centralunits.alternating.period;

import java.math.BigInteger;
import java.util.List;

import ru.susu.algebra.centralunits.alternating.tex.local.MainDivisibilityLemma;
import ru.susu.algebra.field.quadratic.GeneralUnitRecursivePeriodExtractor;
import ru.susu.algebra.pair.Pair;
import ru.susu.algebra.partition.Partition;
import ru.susu.algebra.properties.IPropertySource;

/**
 * Извлекает периоды из рекурентных последовательностей для знакопеременных групп
 * Последовательности основаны на степенях основных единиц соответствующих квадратичных полей для значений характеров
 * {@link GeneralUnitRecursivePeriodExtractor}
 *
 * @author akargapolov
 * @since: 14.10.2010
 */
public interface IAlternatingPeriodExtractor
{
	/**
	 * Возвращает пары alpha beta для последовательности внутри одного периода
	 * @param ps источник свойств
	 * @param partition разбиение
	 * @param mod модуль
	 * @return список пар
	 */
	List<Pair<BigInteger, BigInteger>> getPeriod(IPropertySource ps, Partition partition, BigInteger mod);

	/**
	 * Возвращает длину периода
	 * @param ps источник свойств
	 * @param partition разбиение
	 * @param mod модуль
	 * @return длина периода
	 */
	BigInteger getIntegerPeriod(IPropertySource ps, Partition partition, BigInteger mod);

	/**
	 * Возвращает список пар индекс - t, которые подходят для формулы в {@link MainDivisibilityLemma}, то есть
	 * выполняются условия этой леммы
	 * @param ps источник свойств
	 * @param partition разбиение
	 * @param mod модуль
	 * @return список пар индекс - t
	 */
	List<Pair<BigInteger, BigInteger>> listGoodPeriods(IPropertySource ps, Partition partition, BigInteger mod);
}
